package com.jinzhi.jzapi.utils;

import org.apache.commons.codec.digest.DigestUtils;

import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

/**
 * @Author wuqi
 * @create 2020/4/8 10:40 上午
 */
public class CommonUtil {

    //校验手机号码
    public static final String REGEX = "^(13[0-9]|14[45789]|15[0-3,5-9]|16[67]|17[01235678]|18[0-9]|19[15789])\\d{8}$";

    // 验证身份证号码的正则表达式
    private static final String ID_REGEX = "^(\\d{15}$|^\\d{18}$|^\\d{17}(\\d|X|x))$";

    /**
       * @author：
       * 描述： 校验手机号码
       */
    public static boolean checkTel(String tel){
        return Stream.of(tel).allMatch(t->{
            Pattern p = Pattern.compile(REGEX);
            Matcher m = p.matcher(tel);
            return m.matches();
        });
    }


    /**
     * @author： zenghl
     * @descript： 创建md5对象
     *
     */
    public static String md5(String code) {
        return DigestUtils.md5Hex(code);
    }


    /**
     * @author： zenghl
     * @descript： 进行密码校验
     * userPwd用户输入的密码
     * dbPwd数据库中的密码
     * salt数据库中的盐
     */
    public static boolean checkPassword(String userPwd, String dbPwd, String salt) {
        return dbPwd.equals(md5(userPwd+salt));
    }

    /**
     * @author： zenghl
     * @descript： 获得UUID
     *
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * @author： zenghl
     * @descript： 获得盐值
     *
     */
    public static String getSalt() {
        return getUUID().substring(0, 5);
    }


    /**
     * @author： zenghl
     * @descript： 获得随机密码
     *
     */
    public static String getRandomPwd() {
        return getUUID().substring(0, 9);
    }






    /**
     * 检验身份证号码是否有效
     * @param idNumber 身份证号码
     * @return true：有效；false：无效
     */
    public static boolean isValidID(String idNumber) {
        // 首先检查格式是否合法
        if (!Pattern.matches(ID_REGEX, idNumber)) {
            return false;
        }

        // 对于18位身份证，需要额外检查最后一位校验码是否正确
        if (idNumber.length() == 18) {
            return isValid18ID(idNumber);
        }

        return true;
    }

    // 验证18位身份证的校验码是否正确
    private static boolean isValid18ID(String idNumber) {
        // 加权因子
        int[] weights = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
        // 校验码字符数组
        char[] validationCodes = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

        int sum = 0;
        for (int i = 0; i < 17; i++) {
            char c = idNumber.charAt(i);
            int digit = Character.isDigit(c) ? c - '0' : 10; // 'X'表示10
            sum += digit * weights[i];
        }

        int remainder = sum % 11;
        char expectedValidationCode = validationCodes[remainder];
        char actualValidationCode = idNumber.charAt(17);

        return expectedValidationCode == actualValidationCode;
    }



}
